#encoding:utf-8
'''
FileName:loadutils.py
Creator:王烨
Date:2010.5.22
Comment:直接把Python源文件作为配置文件的支持库
'''
import sys,os.path

Module = type(sys)
modules = {}    #已经导入的配置模块

def LoadText(moduleName, code, env = {}, forceReplace = False, moduleType = Module):
    '''将符合Python语法的一段文本导入为模块
    
    参数：模块名， 模块源码，预载入变量， 自定义返回模块类型'''
    if moduleName in modules and not forceReplace:#如果模块已经载入，则返回缓存的内容
        return modules[moduleName]
    
    m = moduleType(moduleName)
    m.__module_class__ = moduleType
    m.__file__ = moduleName
    m.__dict__.update(env)  #更新局部变量表
    exec compile(code, moduleName, 'exec') in m.__dict__
    
    modules[moduleName] = m
    return m

def LoadFile(fullPath, env = {}, moduleType = Module):
    '''将包含Python源码的文件导入为模块
    
    参数：完整文件路径， 预载入变量， 自定义返回模块类型'''
    try:
        code = open(fullPath).read()
    except IOError:
        raise ImportError,fullPath
    fileName = os.path.basename(fullPath)   #文件名（不含扩展名）作为模块名称
    m = LoadText(fileName, code, env, moduleType)
    m.__file__ = fullPath
    return m

def Unload(module):
    '''卸载已经导入的模块
    
    参数：模块实例'''
    moduleName = os.path.basename(module.__file__)
    del modules[moduleName]
